package com.lab.dto;

import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

/**
 * 用户DTO（数据传输对象）
 * 用于用户注册、创建或更新系统用户信息，对应user表的核心业务字段（学号限定11位）
 */
@Data
public class UserDTO {

    /**
     * 用户名
     * 不可为空且唯一（数据库有uk_user_username约束），建议字母数字下划线组合
     */
    @NotBlank(message = "用户名不能为空")
    @Pattern(regexp = "^[a-zA-Z0-9_]{4,20}$", message = "用户名只能包含字母、数字和下划线，长度4-20位")
    private String username;

    /**
     * 密码（明文传输，后端需加密存储）
     * 不可为空，需符合密码强度要求（示例：8-20位，包含字母和数字）
     */
    @NotBlank(message = "密码不能为空")
    @Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d).{8,20}$", message = "密码需8-20位，且包含字母和数字")
    private String password;

    /**
     * 角色类型
     * 不可为空，目前仅支持admin（管理员），可根据业务扩展其他角色
     */
    @NotBlank(message = "角色类型不能为空")
    @Pattern(regexp = "^admin$", message = "角色类型只能为admin（管理员）")
    private String roleType;

    /**
     * 学号（可选，仅学生用户填写）
     * 若填写则必须为11位数字（与数据库约束及业务要求一致），且唯一（数据库uk_user_student_id约束）
     */
    @Pattern(regexp = "^$|^\\d{11}$", message = "学号必须为11位数字（可为空）")
    private String studentId; // 允许为空，非空时强制11位数字格式
}